package net;

// 写一个最简单的UDP版本的客户端-服务器程序：
// 回显服务器echo server （客户端发啥，服务器就返回啥 ：其实没有任何实际意义）

// 服务器

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    private DatagramSocket  socket = null;  // 先声明

    // 构造方法（服务器要绑定端口号）
    // 参数的端口表示咱们的服务器要绑定的端口！
    // （也就是启动服务器）
    public UdpEchoServer (int port) throws SocketException {
        // 绑定端口号
        socket = new DatagramSocket(port);
    }

    // 启动服务器的方法
    public void start() throws IOException {
        System.out.println("服务器启动");
        // 由于服务器不确定客户端啥时候发请求过来，所以要时刻“严阵以待”，通常情况就使用 while true来作为一个循环
        while(true) {
            // 循环里完成一次请求：
            // 1. 读取请求并解析
            // 构造一个DatagramPacket对象用于receive调用网卡存放读到的数据
            // 创建的同时要分配内存空间（空的）,用于读入用户端的需求
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);  // 网卡读到的内容存放到requestPacket中
            // 把DatagramPacket对象转成字符串，方便我们去打印
            // 字节数组作为参数进行传入,方便后续打印
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());

            // 2. 根据请求计算响应
            String response = process(request);

            // 3. 把响应写回客户端
            // 注意，send方法的参数也是DatagramPacket的实例对象
            // 在构造DatagramPacket实例对象时传入的是响应结果的字节数组！！！（gwtBytes()方法来获取！）
            // 然后服务器的该响应才发送给客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress()); // 再加一个获取客户端地址信息的参数
            socket.send(responsePacket);
            // 发送给谁？（收件人的ip和端口号 =》 即：客户端地址，从请求包裹那儿获取）

            // 4. 打印日志，记录当前情况
            System.out.printf("client[%s:%d] req: %s; resp: %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, response);
        }
    }

    // 当前写的是回显服务器，所以响应的数据就和请求是一样的
    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server = new UdpEchoServer(9090);
        server.start(); // 启动服务器
    }
}
